package pokeronlab_2014.mcts;

import java.io.PrintStream;

import pokeronlab_2014.Controller;

public class GameRules implements Cloneable {
	
	public int elsolap, masodiklap, flop1, flop2, flop3, turn=-1, river;
	//-1 arra kell hogy ki tudjuk venni az 52 lapból mikor nem -1
	double maxCall;
	int	round;
	public int myseat;
	/**
	 * Ennyit emelünk preflop és flop és ennek a kétszeresét turn river
	 */
	public double fixlimit= 0.02;
	/**
	 * az aktuális játékos szék száma -1 ha új közös lap jön
	 */
	public int actualplayer;
	/**
	 * Ha igaz akkor új közös lap következik
	 */
	boolean nextRounnd;
	
	/**
	 * Ahányszor max bettelni lehet még
	 */
	int maxbet;
	
	/**
	 * az a széket mondja meg ahol az utolsó emelés volt
	 */
	public int lastaction;

	/**
	 * A játékban részt vevő játékosok ID-jei szék szerint
	 */
	public int[] playerIDs = new int[10];
	
	/**
	 * A játékba lévő játékosok szék szerint
	 */
	public int[] playeringame = new int[10];
	
	
	
	public double[] chipsToPot = new double[10];
	
	public double[] inpot = new double[10];
	
	
	public GameRules clone(int action){
		GameRules clone = new GameRules();
		clone.elsolap = elsolap;
		clone.masodiklap = masodiklap;
		clone.flop1 = flop1;
		clone.flop2 = flop2;
		clone.flop3 = flop3;
		clone.turn = turn;
		clone.river = river;
		clone.maxCall = maxCall;
		clone.round = round;
		clone.myseat =myseat;
		clone.actualplayer = nextplayer(actualplayer,action);
		clone.lastaction = lastaction;
		clone.maxbet = maxbet;
		PrintStream out = System.out;
		if(action>=100){
			//out.println("megint 10 a max call");
			clone.lastaction = Controller.thisGameInfo.getSmallBlindSeat();
			clone.maxbet =100;
			clone.round++;
			if(clone.round==2)
				clone.turn =action-100;
			if(clone.round==3)
				clone.river = action-100;
		}
		if(action==2)
			clone.maxbet--;
		if(action==2)
			clone.lastaction= actualplayer;
		clone.playerIDs =playerIDs.clone();
		clone.playeringame =playeringame.clone();
		clone.chipsToPot = chipsToPot.clone();
		clone.inpot = inpot.clone();
		return clone;
	}
	
	public GameRules(){
		for(int i=0;i<10 ;i++)
			playeringame[i]=1;
		maxbet = 100;
		round = 1;
		lastaction = Controller.thisGameInfo.getSmallBlindSeat();
	}
	public void setPlyaerID(int playerID[]){
		for(int i=0;i<10;i++)
			playerIDs[i] = playerID[i];
	}
	
	public void setPlayerInGame(int playerSeat){
		playeringame[playerSeat] = 0;
	}

	/**
	 * @param from a mostani játékos székszáma
	 * @return vissza adja a következő játékos székszámát
	 */
	public int nextplayer(int from, int action){
		nextRounnd = false;
		int i=1;
		if(from==-1)
		{
			return Controller.thisGameInfo.getSmallBlindSeat();
		}
		if(lastaction==-1)
		{
			Controller.debugWindow.printMessage("Gamerulse.nextplayer kártya csúcsba beállítjuk a lastaciont a SB-re");
			lastaction=Controller.thisGameInfo.getSmallBlindSeat();	
		}

		while(playeringame[(from+i)%10]!=1){
			i++;
		}		
		
		String tmp = "from= " + from + ", action= " + action + ", i=" + i + ", lastaction= " + lastaction;
		
		
				if((from+i)%10!=lastaction || action==2){
					tmp+= ", next player= " + (from+i)%10;
					//Controller.debugWindow.printMessage(tmp);
//					if(action==2)
//						lastaction=from;
					return (from+i)%10;
				}
				else{
					tmp+= ", next player= " + -1;
					//Controller.debugWindow.printMessage(tmp);
					nextRounnd = true;
					return -1;
				}
				
	}
	
	public int getplayerSeatFromID(int PlayerID){


		for(int i=0; i<10; i++){
			if(playerIDs[i]== PlayerID)
				return i;
		}
		String tmp = "GameRules.playerSeatFromID nincs ilyen ID-jü játékos: " + PlayerID;
		Controller.debugWindow.printMessage(tmp);
		return -1;
	}
	
	public void setmaxcall(double newcall){
		maxCall+=newcall;
	}
	
	/**
	 * Csak akkor akkor kell hívi ha legalább megadot a játékos, ekkor a newcall=0
	 */
	public void setinpot(double newcall, int seat){
//		if(maxCall+newcall-chipsToPot[seat]<0)
//			Controller.debugWindow.printMessage("minusz");
//		if(maxCall+newcall-chipsToPot[seat]>0)
//			Controller.debugWindow.printMessage("pozitiv");
		inpot[seat]+= maxCall+newcall-chipsToPot[seat];
		chipsToPot[seat] = maxCall+newcall-chipsToPot[seat];
	}
	
	public double amunttocall(int seat){
		return maxCall-chipsToPot[seat];
	}
	
	public void newRound(){
		maxCall=0;
		for(int i=0; i<10;i++){
			chipsToPot[i]=0;
		}
	}
	
	public int getPlayerID(int seat){
		if(seat<10 && seat>=0)
			return playerIDs[seat];
		else
			return -1;
	}


}
